/**
 * @author Horváth Miklós 
 */

import greenfoot.*;

import java.util.List;
import java.util.ArrayList;

public class Vombat extends Actor
 {
  private static final int KIGYOMARAS_BUNTETES = 35;
  private static final int LEPES_BUNTETES = 1;
  private static final int ZAB_JUTALOM = 10;
  private static final int MALOM_JUTALOM = 50;
  private static final int KIGYOOLES_JUTALOM = 10;

  private static final int NORMAL_JELLEM = 0;
  private static final int FELOS_JELLEM = 1;
  private static final int FALANK_JELLEM = 2;
  private static final int TAMADO_JELLEM = 3;
  
  private int lepes = 0;
  private int fitness = 0;
  private int irany_x;
  private int irany_y;
  private int jellem;
  private int kigyo_eszleles;
  private int[] x_lepesek;
  private int[] y_lepesek;
  private boolean malomnal = false;
  private GenAlg genalg;

  public Vombat(GenAlg ga)
   {
    genalg = ga;
    x_lepesek = genalg.x_genek_leker();
    y_lepesek = genalg.y_genek_leker();
    jellem = genalg.jellem_leker();
    System.out.println("JELLEM: "+jellem);
    kigyo_eszleles = -5;
    if (jellem == NORMAL_JELLEM)
     {
      setImage("hebat.gif");
     }
    else if (jellem == FELOS_JELLEM)
     {
      setImage("felbat.gif");      
     }
    else if (jellem == FALANK_JELLEM)
     {
      setImage("vomboc.gif");      
     }
    else if (jellem == TAMADO_JELLEM)
     {
      setImage("kigyoolo.gif");      
     }
    System.out.println("------------------------");
    System.out.println("Vombat ID-je: "+genalg.id_leker()+" Generáció: "+genalg.generacioszam_leker());
   }
   
  public boolean mozoghat()
   {
    int x = getX();
    int y = getY();
    if (22 % (irany_x + x + 3) == 0) return false;
    if (22 % (irany_y + y + 3) == 0) return false;
    return true;
   }
  
  private int[] celkereses(java.lang.Class cls)
   {
    int[] talalat = new int[3];
    Actor szomszed;
    List <Actor> szomszedok = getNeighbours(1, true, cls);
    talalat[2] = szomszedok.size();
    if (!szomszedok.isEmpty())
     {
      szomszed = szomszedok.get(0);
      talalat[0] = szomszed.getX();
      talalat[1] = szomszed.getY();
     }
    return talalat;
   }
   
  public void mozog()
   {
    int x = getX();
    int y = getY();
    int[] talalat;
    boolean celt_talalt = false;
    if (jellem == FALANK_JELLEM)
     {
      talalat = celkereses(Zab.class);
      if (talalat[2] > 0 && (lepes - kigyo_eszleles) > 4)
       {
        x = talalat[0];
        y = talalat[1];
        celt_talalt = true;
        kigyo_eszleles = lepes;
       }
     }
    if (jellem == FELOS_JELLEM)
     {
      talalat = celkereses(Kigyo.class);
      if(talalat[2] > 0 && (lepes - kigyo_eszleles) > 4)
       {
        x += x - talalat[0];
        y += y - talalat[1];
        celt_talalt = true;
        kigyo_eszleles = lepes;
       }
     }
    if (jellem == TAMADO_JELLEM)
     {  
      talalat = celkereses(Kigyo.class);
      if (talalat[2] > 0 && (lepes - kigyo_eszleles) > 4)
       {
        x = talalat[0];
        y = talalat[1];
        celt_talalt = true;
       }
     }
    if (mozoghat() && celt_talalt == false)
     {
      x += irany_x;
      y += irany_y;
     }
    setLocation(x, y);
    lepes++;
    fitness -= LEPES_BUNTETES;
   }

  public boolean zabeves()
   {
    Actor zab = getOneObjectAtOffset(0, 0, Zab.class);
    if (zab != null)
     {
      getWorld().removeObject(zab);
      fitness += ZAB_JUTALOM;
      return true;
     }
    return false;
   }
  
  public boolean kigyomaras()
   {
    boolean maras = true;
    Actor kigyo = getOneObjectAtOffset(0, 0, Kigyo.class);
    if (kigyo != null)
     {
      if (jellem == TAMADO_JELLEM && (lepes - kigyo_eszleles) > 4)
       {
        kigyo_eszleles = lepes;
        if (Greenfoot.getRandomNumber(2) == 1)
         {
          getWorld().removeObject(kigyo);
          fitness += KIGYOOLES_JUTALOM;
          System.out.println("KÍGYÓT ÖLT!");
          maras = false;
         }
       }
      if (maras)
       {
        fitness -= KIGYOMARAS_BUNTETES;
        return true;
       }
     }
    return false;
   }
   
  public boolean hegyeztet()
   {
    Actor malom = getOneObjectAtOffset(0, 0, Malom.class);
    if (malom != null) 
     {
      fitness += MALOM_JUTALOM;
      return true;
     }
    return false;
   }
  
  public int fitness_leker()
   {
    return fitness;
   }
   
  public void act()
   {
    System.out.println("--------------------");
    System.out.println("Generáció: "+genalg.generacioszam_leker()+" Egyed: "+genalg.id_leker());
    System.out.println("--------------------");    
    System.out.println("Ennyit lépett: "+lepes);
    if (malomnal)
     {
      getWorld().repaint();
     }
    else
     {
      irany_x = x_lepesek[lepes];
      irany_y = y_lepesek[lepes];
      mozog();
      if (zabeves()) System.out.println("Zabot talált!");
      if (kigyomaras()) System.out.println("Megmarta egy kígyó!");
      if (hegyeztet())
       {
        System.out.println("Zabot hegyeztet!");
        genalg.fitness_atadas(fitness);
        malomnal = true;
       }
      System.out.println("Fitness: "+fitness);
      System.out.println("X Lépés: "+x_lepesek[lepes]);    
      System.out.println("Y Lépés: "+y_lepesek[lepes]);
      if (lepes == x_lepesek.length-1)
       {
        System.out.println("Már nem tud mozogni!");
        genalg.fitness_atadas(fitness);
        getWorld().repaint();
       }
     }
   }
 }